

**************************************************************
* descriptive: stylized facts based on aggregate time series *
**************************************************************


********** descriptives for appendix
use "article level quality data.dta", clear

gen n=1

bysort type: egen type_n = count(n) if !missing(type)
egen type_N = count(n) if !missing(type)
gen type_s = type_n/type_N if !missing(type)
encode type, gen(type_num)

foreach var of varlist topic level context format style geo {
	bysort `var': egen `var'_n = count(n) if type == "LABEL_0" & !missing(`var')
	egen `var'_N = count(n) if type == "LABEL_0" & !missing(`var')
	gen `var'_s = `var'_n/`var'_N if type == "LABEL_0" & !missing(`var')
    encode `var', gen(`var'_num)
}

collapse (mean) type_s topic_s level_s context_s format_s style_s geo_s, ///
 by(type_num topic_num level_num context_num format_num style_num geo_num)

* Figure A1: Classification of articles according to relevant quality criteria
* A: Article type
twoway (bar type_s type_num, barw(0.5)), ///
 scheme(s2mono) graphregion(color(white)) plotregion(margin(zero)) scale(1.6) aspect(0.6) ///
 ylabel(0(0.2)0.8, angle(0) gmin gmax) ytitle("Share of articles") ///
 xtitle(" ") xscale(range(0.5 2.5)) ///
 xlabel(1 "Journalistic content" 2 "Non-journalistic content", angle(45))
* B: Topic relevance
twoway (bar topic_s topic_num, barw(0.5)), ///
 scheme(s2mono) graphregion(color(white)) plotregion(margin(zero)) scale(1.6) aspect(0.6) ///
 ylabel(0(0.1)0.4, angle(0) gmin gmax) ytitle("Share of articles") ///
 xtitle(" ") xscale(range(0.5 5.5)) ///
 xlabel(1 "Politics" 2 "Economics/business" 3 "Arts/culture" 4 "Sports" 5 "Human interest/other", angle(45)) 
* C: Actor relevance
twoway (bar level_s level_num, barw(0.5)), ///
 scheme(s2mono) graphregion(color(white)) plotregion(margin(zero)) scale(1.6) aspect(0.6) ///
 ylabel(0(0.1)0.4, angle(0) gmin gmax) ytitle("Share of articles") ///
 xtitle(" ") xscale(range(0.5 4.5)) ///
 xlabel(1 "Macro" 2 "Meso" 3 "Micro (functional)" 4 "Micro (other)", angle(45)) 
* D: Thematic orientation
twoway (bar context_s context_num, barw(0.5)), ///
 scheme(s2mono) graphregion(color(white)) plotregion(margin(zero)) scale(1.95) aspect(0.9) ///
 ylabel(0(0.2)0.8, angle(0) gmin gmax) ytitle("Share of articles") ///
 xtitle(" ") xscale(range(0.5 2.5)) ///
 xlabel(1 "Thematic" 2 "Episodic", angle(45)) 
* E: Interpretative performance
twoway (bar format_s format_num, barw(0.5)), ///
 scheme(s2mono) graphregion(color(white)) plotregion(margin(zero)) scale(1.6) aspect(0.8) ///
 ylabel(0(0.1)0.5, angle(0) gmin gmax labsize(small)) ytitle("Share of articles", size(small)) ///
 xtitle(" ") xscale(range(0.5 6.5)) ///
 xlabel(1 "News flash" 2 "News report" 3 "List, agency report" ///
 4 "Portrait, interview, review" 5 "Reportage" 6 "Opinion article", angle(45) labsize(small)) 
* F: Objectivity 
twoway (bar style_s style_num, barw(0.5)), ///
 scheme(s2mono) graphregion(color(white)) plotregion(margin(zero)) scale(1.5) aspect(0.75) ///
 ylabel(0(0.2)0.8, angle(0) gmin gmax) ytitle("Share of articles") ///
 xtitle(" ") xscale(range(0.5 2.5)) ///
 xlabel(1 "Cognitive-normative" 2 "Moral-emotional", angle(45)) 
* G: Geographical reference  
twoway (bar geo_s geo_num, barw(0.5)), ///
 scheme(s2mono) graphregion(color(white)) plotregion(margin(zero)) scale(1.6) aspect(0.6) ///
 ylabel(0(0.2)0.6, angle(0) gmin gmax) ytitle("Share of articles") ///
 xtitle(" ") xscale(range(0.5 4.5)) ///
 xlabel(1 "Local/regional" 2 "National/bilateral" 3 "Other country" 4 "International/multilateral", angle(45)) 
 
 
 
 
 

************ time trends
use "outlet month quality data.dta", clear

collapse (mean) m_quality=quality m_geo_loc=geo_loc m_geo_nat=geo_nat ///
 m_geo_foreign=geo_foreign m_geo_multi=geo_multi ///
 m_share_journ=share_journ m_agency=agency ///
 m_diversity=diversity ///
 m_dup_headline_text=dup_headline_text m_topic_1=topic_1 m_topic_2=topic_2 ///
 m_topic_3=topic_3  m_topic_4=topic_4  m_topic_5=topic_5 m_level_1=level_1 ///
 m_level_2=level_2 m_level_3=level_3 m_level_4=level_4 m_context_1=context_1 ///
 m_context_2=context_2 m_format_1=format_1 m_format_2=format_2 m_format_3=format_3 ///
 m_format_4=format_4 m_format_5=format_5 m_format_6=format_6 m_style_1=style_1 m_style_2=style_2 ///
 (sd) sd_quality=quality sd_geo_loc=geo_loc sd_geo_nat=geo_nat ///
 sd_geo_foreign=geo_foreign sd_geo_multi=geo_multi ///
 sd_share_journ=share_journ ///
 sd_agency=agency ///
 sd_diversity=diversity sd_dup_headline_text=dup_headline_text ///
 sd_topic_1=topic_1 sd_topic_2=topic_2 ///
 sd_topic_3=topic_3  sd_topic_4=topic_4  sd_topic_5=topic_5 sd_level_1=level_1 ///
 sd_level_2=level_2 sd_level_3=level_3 sd_level_4=level_4 sd_context_1=context_1 ///
 sd_context_2=context_2 sd_format_1=format_1 sd_format_2=format_2 sd_format_3=format_3 ///
 sd_format_4=format_4 sd_format_5=format_5 sd_format_6=format_6 sd_style_1=style_1 sd_style_2=style_2 ///
 (count) n=quality [aweight=articles_journ], by(tm)
 
merge 1:1 tm using "newspapers and owners/consolidation measures.dta"
drop _merge
 
foreach var in quality geo_loc geo_nat geo_foreign geo_multi share_journ agency dup_headline_text topic_1 topic_2 topic_3 topic_4 topic_5 level_1 level_2 level_3 level_4 context_1 context_2 format_1 format_2 format_3 format_4 format_5 format_6 style_1 style_2 {
	gen hi_`var' = m_`var' + invttail(n-1,0.025)*(sd_`var' / sqrt(n))
	gen lo_`var' = m_`var' - invttail(n-1,0.025)*(sd_`var' / sqrt(n))
}

* Figure 1: Characteristics of newspaper coverage, over time
* A: News content quality
graph twoway (line m_quality tm, lcolor(gs10) lwidth(thin)) (lpoly m_quality tm) ///
 (rarea hi_quality lo_quality tm, color(gs10%30)), ///
 scheme(s2mono) graphregion(color(white)) plotregion(margin(zero)) scale(1.5) legend(off) ///
 ylabel(4.6(0.4)6.2, angle(0) gmin gmax format(%9.1f)) xtitle(" ") xmtick(648(1)755) ///
 xlabel(648 "2014" 672 "2016" 696 "2018" 720 "2020" 744 "2022") ///
 ytitle("Score")

* B: Journalistic content
graph twoway (line m_share_journ tm, lcolor(gs10) lwidth(thin)) (lpoly m_share_journ tm) ///
 (rarea hi_share_journ lo_share_journ tm, color(gs10%30)), ///
 scheme(s2mono) graphregion(color(white)) plotregion(margin(zero)) scale(1.5) legend(off) ///
 ylabel(0.65(0.05)0.9, angle(0) gmin gmax format(%9.2f)) xtitle(" ") xmtick(648(1)755) ///
 xlabel(648 "2014" 672 "2016" 696 "2018" 720 "2020" 744 "2022") ///
 ytitle("Share of articles") 
 
* C: Local content
graph twoway (line m_geo_loc tm, lcolor(gs10) lwidth(thin)) (lpoly m_geo_loc tm)  ///
 (rarea hi_geo_loc lo_geo_loc tm, color(gs10%30)), ///
 scheme(s2mono) graphregion(color(white)) plotregion(margin(zero)) scale(1.5) legend(off) ///
 ylabel(0.45(0.05)0.7, angle(0) gmin gmax format(%9.2f)) xtitle(" ") xmtick(648(1)755) ///
 xlabel(648 "2014" 672 "2016" 696 "2018" 720 "2020" 744 "2022") ///
 ytitle("Share of articles")
 
* D: Content from news agencies
graph twoway (line m_agency tm, lcolor(gs10) lwidth(thin)) (lpoly m_agency tm) ///
 (rarea hi_agency lo_agency tm, color(gs10%30)), ///
 scheme(s2mono) graphregion(color(white)) plotregion(margin(zero)) scale(1.5) legend(off) ///
 ylabel(0(0.05)0.25, angle(0) gmin gmax format(%9.2f)) xtitle(" ") xmtick(648(1)755) ///
 xlabel(648 "2014" 672 "2016" 696 "2018" 720 "2020" 744 "2022") ///
 ytitle("Share of articles")

* E: Content sharing among co-owned newspapers
graph twoway (line m_dup_headline_text tm, lcolor(gs10) lwidth(thin)) (lpoly m_dup_headline_text tm) ///
 (rarea hi_dup_headline_text lo_dup_headline_text tm, color(gs10%30)), ///
 scheme(s2mono) graphregion(color(white)) plotregion(margin(zero)) scale(1.5) legend(off) ///
 ylabel(0(0.1)0.4, angle(0) gmin gmax format(%9.2f)) xtitle(" ") xmtick(648(1)755) ///
 xlabel(648 "2014" 672 "2016" 696 "2018" 720 "2020" 744 "2022") ///
 ytitle("Share of articles")


 
 
* Figure 2: Market concentration
graph twoway (line hhi tm), ///
 scheme(s2mono) graphregion(color(white)) plotregion(margin(zero)) scale(1.5) legend(off) ///
 ylabel(0(500)3500, angle(0) gmin gmax) ytitle("Herfindahl-Hirschman Index") xtitle(" ") xmtick(648(1)755) ///
 xlabel(648 "2014" 672 "2016" 696 "2018" 720 "2020" 744 "2022")
 
 
 
 
 
 
 
 
 
* Figure A2: Trends in subcategories of topics relevance
* A: Politics
graph twoway (line m_topic_1 tm, lcolor(gs10) lwidth(thin)) (lpoly m_topic_1 tm) ///
 (rarea hi_topic_1 lo_topic_1 tm, color(gs10%30)), ///
 scheme(s2mono) graphregion(color(white)) plotregion(margin(zero)) scale(1.8) aspect(0.9) legend(off) ///
 ylabel(0(0.1)0.5, angle(0) gmin gmax format(%9.1f)) xtitle(" ") xmtick(648(1)755) ///
 xlabel(648 "2014" 672 "2016" 696 "2018" 720 "2020" 744 "2022") ///
 ytitle("Share of articles") 
* B: Economics/business
graph twoway (line m_topic_2 tm, lcolor(gs10) lwidth(thin)) (lpoly m_topic_2 tm) ///
 (rarea hi_topic_2 lo_topic_2 tm, color(gs10%30)), ///
 scheme(s2mono) graphregion(color(white)) plotregion(margin(zero)) scale(1.8) aspect(0.9) legend(off) ///
 ylabel(0(0.1)0.5, angle(0) gmin gmax format(%9.1f)) xtitle(" ") xmtick(648(1)755) ///
 xlabel(648 "2014" 672 "2016" 696 "2018" 720 "2020" 744 "2022") ///
 ytitle("Share of articles")
* C: Arts/culture
graph twoway (line m_topic_3 tm, lcolor(gs10) lwidth(thin)) (lpoly m_topic_3 tm) ///
 (rarea hi_topic_3 lo_topic_3 tm, color(gs10%30)), ///
 scheme(s2mono) graphregion(color(white)) plotregion(margin(zero)) scale(1.8) aspect(0.9) legend(off) ///
 ylabel(0(0.1)0.5, angle(0) gmin gmax format(%9.1f)) xtitle(" ") xmtick(648(1)755) ///
 xlabel(648 "2014" 672 "2016" 696 "2018" 720 "2020" 744 "2022") ///
 ytitle("Share of articles") 
* D: Sports
graph twoway (line m_topic_4 tm, lcolor(gs10) lwidth(thin)) (lpoly m_topic_4 tm) ///
 (rarea hi_topic_4 lo_topic_4 tm, color(gs10%30)), ///
 scheme(s2mono) graphregion(color(white)) plotregion(margin(zero)) scale(1.8) aspect(0.9) legend(off) ///
 ylabel(0(0.1)0.5, angle(0) gmin gmax format(%9.1f)) xtitle(" ") xmtick(648(1)755) ///
 xlabel(648 "2014" 672 "2016" 696 "2018" 720 "2020" 744 "2022") ///
 ytitle("Share of articles") 
* E: Human interest/other
graph twoway (line m_topic_5 tm, lcolor(gs10) lwidth(thin)) (lpoly m_topic_5 tm) ///
 (rarea hi_topic_5 lo_topic_5 tm, color(gs10%30)), ///
 scheme(s2mono) graphregion(color(white)) plotregion(margin(zero)) scale(1.8) aspect(0.9) legend(off) ///
 ylabel(0(0.1)0.5, angle(0) gmin gmax format(%9.1f)) xtitle(" ") xmtick(648(1)755) ///
 xlabel(648 "2014" 672 "2016" 696 "2018" 720 "2020" 744 "2022") ///
 ytitle("Share of articles") 
 
 

* Figure A3: Trends in subcategories of actor relevance
* A: Macro level
graph twoway (line m_level_1 tm, lcolor(gs10) lwidth(thin)) (lpoly m_level_1 tm) ///
 (rarea hi_level_1 lo_level_1 tm, color(gs10%30)), ///
 scheme(s2mono) graphregion(color(white)) plotregion(margin(zero)) scale(1.8) aspect(0.9) legend(off) ///
 ylabel(0(0.1)0.5, angle(0) gmin gmax format(%9.1f)) xtitle(" ") xmtick(648(1)755) ///
 xlabel(648 "2014" 672 "2016" 696 "2018" 720 "2020" 744 "2022") ///
 ytitle("Share of articles")
* B: Meso level
graph twoway (line m_level_2 tm, lcolor(gs10) lwidth(thin)) (lpoly m_level_2 tm) ///
 (rarea hi_level_2 lo_level_2 tm, color(gs10%30)), ///
 scheme(s2mono) graphregion(color(white)) plotregion(margin(zero)) scale(1.8) aspect(0.9) legend(off) ///
 ylabel(0(0.1)0.5, angle(0) gmin gmax format(%9.1f)) xtitle(" ") xmtick(648(1)755) ///
 xlabel(648 "2014" 672 "2016" 696 "2018" 720 "2020" 744 "2022") ///
 ytitle("Share of articles")
* C: Micro level (functional)
graph twoway (line m_level_3 tm, lcolor(gs10) lwidth(thin)) (lpoly m_level_3 tm) ///
 (rarea hi_level_3 lo_level_3 tm, color(gs10%30)), ///
 scheme(s2mono) graphregion(color(white)) plotregion(margin(zero)) scale(1.8) aspect(0.9) legend(off) ///
 ylabel(0(0.1)0.5, angle(0) gmin gmax format(%9.1f)) xtitle(" ") xmtick(648(1)755) ///
 xlabel(648 "2014" 672 "2016" 696 "2018" 720 "2020" 744 "2022") ///
 ytitle("Share of articles")
* D: Micro level (other)
graph twoway (line m_level_4 tm, lcolor(gs10) lwidth(thin)) (lpoly m_level_4 tm) ///
 (rarea hi_level_4 lo_level_4 tm, color(gs10%30)), ///
 scheme(s2mono) graphregion(color(white)) plotregion(margin(zero)) scale(1.8) aspect(0.9) legend(off) ///
 ylabel(0(0.1)0.5, angle(0) gmin gmax format(%9.1f)) xtitle(" ") xmtick(648(1)755) ///
 xlabel(648 "2014" 672 "2016" 696 "2018" 720 "2020" 744 "2022") ///
 ytitle("Share of articles")
 
 
 
* Figure A4: Trends in subcategories of thematic orientation
* A: Thematic reporting
graph twoway (line m_context_1 tm, lcolor(gs10) lwidth(thin)) (lpoly m_context_1 tm) ///
 (rarea hi_context_1 lo_context_1 tm, color(gs10%30)), ///
 scheme(s2mono) graphregion(color(white)) plotregion(margin(zero)) scale(1.8) aspect(0.9) legend(off) ///
 ylabel(0(0.2)1, angle(0) gmin gmax format(%9.1f)) xtitle(" ") xmtick(648(1)755) ///
 xlabel(648 "2014" 672 "2016" 696 "2018" 720 "2020" 744 "2022") ///
 ytitle("Share of articles")
* B: Episodic reporting
graph twoway (line m_context_2 tm, lcolor(gs10) lwidth(thin)) (lpoly m_context_2 tm) ///
 (rarea hi_context_2 lo_context_2 tm, color(gs10%30)), ///
 scheme(s2mono) graphregion(color(white)) plotregion(margin(zero)) scale(1.8) aspect(0.9) legend(off) ///
 ylabel(0(0.2)1, angle(0) gmin gmax format(%9.1f)) xtitle(" ") xmtick(648(1)755) ///
 xlabel(648 "2014" 672 "2016" 696 "2018" 720 "2020" 744 "2022") ///
 ytitle("Share of articles")
 
 
 
* Figure A5: Trends in subcategories of interpretative performance
* A: News flash
graph twoway (line m_format_1 tm, lcolor(gs10) lwidth(thin)) (lpoly m_format_1 tm) ///
 (rarea hi_format_1 lo_format_1 tm, color(gs10%30)), ///
 scheme(s2mono) graphregion(color(white)) plotregion(margin(zero)) scale(1.8) aspect(0.9) legend(off) ///
 ylabel(0(0.1)0.4, angle(0) gmin gmax format(%9.1f)) xtitle(" ") xmtick(648(1)755) ///
 xlabel(648 "2014" 672 "2016" 696 "2018" 720 "2020" 744 "2022") ///
 ytitle("Share of articles")
* B: News report
graph twoway (line m_format_2 tm, lcolor(gs10) lwidth(thin)) (lpoly m_format_2 tm) ///
 (rarea hi_format_2 lo_format_2 tm, color(gs10%30)), ///
 scheme(s2mono) graphregion(color(white)) plotregion(margin(zero)) scale(1.8) aspect(0.9) legend(off) ///
 ylabel(0.4(0.1)0.8, angle(0) gmin gmax format(%9.1f)) xtitle(" ") xmtick(648(1)755) ///
 xlabel(648 "2014" 672 "2016" 696 "2018" 720 "2020" 744 "2022") ///
 ytitle("Share of articles")
* C: List, agency report
graph twoway (line m_format_3 tm, lcolor(gs10) lwidth(thin)) (lpoly m_format_3 tm) ///
 (rarea hi_format_3 lo_format_3 tm, color(gs10%30)), ///
 scheme(s2mono) graphregion(color(white)) plotregion(margin(zero)) scale(1.8) aspect(0.9) legend(off) ///
 ylabel(0(0.1)0.4, angle(0) gmin gmax format(%9.1f)) xtitle(" ") xmtick(648(1)755) ///
 xlabel(648 "2014" 672 "2016" 696 "2018" 720 "2020" 744 "2022") ///
 ytitle("Share of articles")
* D: Portrait, interview, review
graph twoway (line m_format_4 tm, lcolor(gs10) lwidth(thin)) (lpoly m_format_4 tm) ///
 (rarea hi_format_4 lo_format_4 tm, color(gs10%30)), ///
 scheme(s2mono) graphregion(color(white)) plotregion(margin(zero)) scale(1.8) aspect(0.9) legend(off) ///
 ylabel(0(0.1)0.4, angle(0) gmin gmax format(%9.1f)) xtitle(" ") xmtick(648(1)755) ///
 xlabel(648 "2014" 672 "2016" 696 "2018" 720 "2020" 744 "2022") ///
 ytitle("Share of articles")
* E: Reportage
graph twoway (line m_format_5 tm, lcolor(gs10) lwidth(thin)) (lpoly m_format_5 tm) ///
 (rarea hi_format_5 lo_format_5 tm, color(gs10%30)), ///
 scheme(s2mono) graphregion(color(white)) plotregion(margin(zero)) scale(1.8) aspect(0.9) legend(off) ///
 ylabel(0(0.1)0.4, angle(0) gmin gmax format(%9.1f)) xtitle(" ") xmtick(648(1)755) ///
 xlabel(648 "2014" 672 "2016" 696 "2018" 720 "2020" 744 "2022") ///
 ytitle("Share of articles")
* F: Opinion article
graph twoway (line m_format_6 tm, lcolor(gs10) lwidth(thin)) (lpoly m_format_6 tm) ///
 (rarea hi_format_6 lo_format_6 tm, color(gs10%30)), ///
 scheme(s2mono) graphregion(color(white)) plotregion(margin(zero)) scale(1.8) aspect(0.9) legend(off) ///
 ylabel(0(0.1)0.4, angle(0) gmin gmax format(%9.1f)) xtitle(" ") xmtick(648(1)755) ///
 xlabel(648 "2014" 672 "2016" 696 "2018" 720 "2020" 744 "2022") ///
 ytitle("Share of articles")
 
 
 
* Figure A6: Trends in subcategories of objectivity
* A: Cognitive-normative
graph twoway (line m_style_1 tm, lcolor(gs10) lwidth(thin)) (lpoly m_style_1 tm) ///
 (rarea hi_style_1 lo_style_1 tm, color(gs10%30)), ///
 scheme(s2mono) graphregion(color(white)) plotregion(margin(zero)) scale(1.8) aspect(0.9) legend(off) ///
 ylabel(0(0.2)1, angle(0) gmin gmax format(%9.1f)) xtitle(" ") xmtick(648(1)755) ///
 xlabel(648 "2014" 672 "2016" 696 "2018" 720 "2020" 744 "2022") ///
 ytitle("Share of articles")
* B: Moral-emotional
graph twoway (line m_style_2 tm, lcolor(gs10) lwidth(thin)) (lpoly m_style_2 tm) ///
 (rarea hi_style_2 lo_style_2 tm, color(gs10%30)), ///
 scheme(s2mono) graphregion(color(white)) plotregion(margin(zero)) scale(1.8) aspect(0.9) legend(off) ///
 ylabel(0(0.2)1, angle(0) gmin gmax format(%9.1f)) xtitle(" ") xmtick(648(1)755) ///
 xlabel(648 "2014" 672 "2016" 696 "2018" 720 "2020" 744 "2022") ///
 ytitle("Share of articles")
 
 
 
* Figure A7: Trends in subcategories of geographical reference
* A: Local/regional
graph twoway (line m_geo_loc tm, lcolor(gs10) lwidth(thin)) (lpoly m_geo_loc tm) ///
 (rarea hi_geo_loc lo_geo_loc tm, color(gs10%30)), ///
 scheme(s2mono) graphregion(color(white)) plotregion(margin(zero)) scale(1.8) aspect(0.9) legend(off) ///
 ylabel(0.3(0.1)0.7, angle(0) gmin gmax format(%9.1f)) xtitle(" ") xmtick(648(1)755) ///
 xlabel(648 "2014" 672 "2016" 696 "2018" 720 "2020" 744 "2022") ///
 ytitle("Share of articles")
* B: National/bilateral
graph twoway (line m_geo_nat tm, lcolor(gs10) lwidth(thin)) (lpoly m_geo_nat tm) ///
 (rarea hi_geo_nat lo_geo_nat tm, color(gs10%30)), ///
 scheme(s2mono) graphregion(color(white)) plotregion(margin(zero)) scale(1.8) aspect(0.9) legend(off) ///
 ylabel(0(0.1)0.4, angle(0) gmin gmax format(%9.1f)) xtitle(" ") xmtick(648(1)755) ///
 xlabel(648 "2014" 672 "2016" 696 "2018" 720 "2020" 744 "2022") ///
 ytitle("Share of articles")
* C: Other country
graph twoway (line m_geo_foreign tm, lcolor(gs10) lwidth(thin)) (lpoly m_geo_foreign tm) ///
 (rarea hi_geo_foreign lo_geo_foreign tm, color(gs10%30)), ///
 scheme(s2mono) graphregion(color(white)) plotregion(margin(zero)) scale(1.8) aspect(0.9) legend(off) ///
 ylabel(0(0.05)0.2, angle(0) gmin gmax format(%9.1f)) xtitle(" ") xmtick(648(1)755) ///
 xlabel(648 "2014" 672 "2016" 696 "2018" 720 "2020" 744 "2022") ///
 ytitle("Share of articles")
* D: International/multilateral
graph twoway (line m_geo_multi tm, lcolor(gs10) lwidth(thin)) (lpoly m_geo_multi tm) ///
 (rarea hi_geo_multi lo_geo_multi tm, color(gs10%30)), ///
 scheme(s2mono) graphregion(color(white)) plotregion(margin(zero)) scale(1.8) aspect(0.9) legend(off) ///
 ylabel(0(0.05)0.2, angle(0) gmin gmax format(%9.1f)) xtitle(" ") xmtick(648(1)755) ///
 xlabel(648 "2014" 672 "2016" 696 "2018" 720 "2020" 744 "2022") ///
 ytitle("Share of articles")
 
 
 
 
 


* Figure A8: Newspaper acquisitions over time
use "outlet month quality data.dta", clear

collapse (sum) post, by(tm)
 
tsset tm
gen d_post = d.post
replace d_post = 0 if d_post < 0

twoway (bar d_post tm), ///
 scheme(s2mono) graphregion(color(white)) plotregion(margin(zero)) scale(1)  legend(off) ///
 ylabel(0(2)16, angle(0) gmin gmax) xtitle(" ") xmtick(648(1)755) ///
 xlabel(648 "2014" 660 "2015" 672 "2016" 684 "2017" 696 "2018" 708 "2019" 720 "2020" 732 "2021" 744 "2022", angle(45)) ///
 ytitle("Number of acquired newspapers")


 
* Figure A9: Newspaper co-ownership over time
use "outlet month quality data.dta", clear

gen n=1
collapse (sum) n, by(owner tm)
collapse (mean) n, by(tm)

twoway (bar n tm), ///
 scheme(s2mono) graphregion(color(white)) plotregion(margin(zero)) scale(1.5)  legend(off) ///
 ylabel(0(2)10, angle(0) gmin gmax) xtitle(" ") xmtick(648(1)755) ///
 xlabel(648 "2014" 672 "2016" 696 "2018" 720 "2020" 744 "2022")  ///
 ytitle("Average number of" "newspapers per owner")
 
 
 
 
 

* Figure A10: Examples of newspapers with different degrees of change in news content quality
use "outlet month quality data.dta", clear
tsset outlet_id tm
 
* A: Filipstads Tidning
graph twoway (line quality tm if outlet == "Filipstads Tidning", lcolor(gs12) lwidth(thin)) ///
             (lpolyci quality tm if outlet == "Filipstads Tidning", bw(10) acolor(gs8%50) lpattern(dot)), ///
 scheme(s2mono) graphregion(color(white)) plotregion(margin(zero)) scale(1.8) legend(off) ///
 ylabel(4(0.5)6.5, angle(0) gmin gmax format(%9.1f)) xtitle(" ") xmtick(648(1)755) ///
 xlabel(648 "2014" 672 "2016" 696 "2018" 720 "2020" 744 "2022") ///
 ytitle("Score")
* B: Arbetarbladet
graph twoway (line quality tm if outlet == "Arbetarbladet", lcolor(gs12) lwidth(thin)) ///
             (lpolyci quality tm if outlet == "Arbetarbladet", bw(10) acolor(gs8%50) lpattern(dot)), ///
 scheme(s2mono) graphregion(color(white)) plotregion(margin(zero)) scale(1.8) legend(off) ///
 ylabel(4(0.5)6.5, angle(0) gmin gmax format(%9.1f)) xtitle(" ") xmtick(648(1)755) ///
 xlabel(648 "2014" 672 "2016" 696 "2018" 720 "2020" 744 "2022") ///
 ytitle("Score") 
* C: Eskilstuna-Kuriren
graph twoway (line quality tm if outlet == "Eskilstunakuriren", lcolor(gs12) lwidth(thin)) ///
             (lpolyci quality tm if outlet == "Eskilstunakuriren", bw(10) acolor(gs8%50) lpattern(dot)), ///
 scheme(s2mono) graphregion(color(white)) plotregion(margin(zero)) scale(1.8) legend(off) ///
 ylabel(4(0.5)6.5, angle(0) gmin gmax format(%9.1f)) xtitle(" ") xmtick(648(1)755) ///
 xlabel(648 "2014" 672 "2016" 696 "2018" 720 "2020" 744 "2022") ///
 ytitle("Score")
 
 
 
 
 
 
* Figure A11: Trends in news content quality of example newspapers with ownership change
use "outlet month quality data.dta", clear
tsset outlet_id tm

* A: Vimmerby Tidning
* 2014m1-2018m1 Swepress Media; 2018m2-2019m4 NTM-koncernen
graph twoway (line quality tm if outlet == "Vimmerby Tidning", lcolor(gs12) lwidth(thin)) ///
             (lpolyci quality tm if outlet == "Vimmerby Tidning" & tm <= tm(2018m1), bw(10) acolor(gs8%50) lpattern(dot)) ///
             (lpolyci quality tm if outlet == "Vimmerby Tidning" & tm >= tm(2018m2), bw(10) acolor(gs8%50) lpattern(dot)), ///
 scheme(s2mono) graphregion(color(white)) plotregion(margin(zero)) scale(1.8) legend(off) ///
 ylabel(4.5(0.5)6.5, angle(0) gmin gmax format(%9.1f)) xtitle(" ") xmtick(648(1)755) ///
 xlabel(648 "2014" 672 "2016" 696 "2018" 720 "2020" 744 "2022") ///
 ytitle("Score") xline(696.5, lpattern(dash) lcolor(black))

* B: Östersundsposten
* 2014m1-2019m1 Mittmedia; 2019m2-2022m12 Bonnier
graph twoway (line quality tm if outlet == "Östersundsposten", lcolor(gs12) lwidth(thin)) ///
             (lpolyci quality tm if outlet == "Östersundsposten" & tm <= tm(2019m1), bw(10) acolor(gs8%50) lpattern(dot)) ///
             (lpolyci quality tm if outlet == "Östersundsposten" & tm >= tm(2019m2), bw(10) acolor(gs8%50) lpattern(dot)), ///
 scheme(s2mono) graphregion(color(white)) plotregion(margin(zero)) scale(1.8) legend(off) ///
 ylabel(4.5(0.5)6.5, angle(0) gmin gmax format(%9.1f)) xtitle(" ") xmtick(648(1)755) ///
 xlabel(648 "2014" 672 "2016" 696 "2018" 720 "2020" 744 "2022") ///
 ytitle("Score") xline(708.5, lpattern(dash) lcolor(black))
 
* C: Tranås Tidning
* 2014m1-2020m2 Hall Media; 2020m3-2022m12 Bonnier 
graph twoway (line quality tm if outlet == "Tranås Tidning", lcolor(gs12) lwidth(thin)) ///
             (lpolyci quality tm if outlet == "Tranås Tidning" & tm <= tm(2020m2), bw(10) acolor(gs8%50) lpattern(dot)) ///
             (lpolyci quality tm if outlet == "Tranås Tidning" & tm >= tm(2020m3), bw(10) acolor(gs8%50) lpattern(dot)), ///
 scheme(s2mono) graphregion(color(white)) plotregion(margin(zero)) scale(1.8) legend(off) ///
 ylabel(4.5(0.5)6.5, angle(0) gmin gmax format(%9.1f)) xtitle(" ") xmtick(648(1)755) ///
 xlabel(648 "2014" 672 "2016" 696 "2018" 720 "2020" 744 "2022") ///
 ytitle("Score") xline(721.5, lpattern(dash) lcolor(black))
 
 
 
  
 
 
 
 
 
 
 
 
 
 
 
* Table A13: News content quality, by newspaper owner 
use "outlet month quality data.dta", clear

bysort owner tm: gen n = _N

collapse (mean) quality (sd) sd_quality=quality (max) n [aweight=articles_journ], by(owner) 
gsort -quality
format %9.2f quality
format %9.2f sd_quality



* Table A14: Top 10 newspapers in terms of news content quality 
use "outlet month quality data.dta", clear

collapse (mean) quality (sd) sd_quality=quality [aweight=articles_journ], by(outlet) 
gsort -quality
format %9.2f quality
format %9.2f sd_quality 
 
 
 
 
 
 
 
 
 
 
***********************
* Regression analysis *
***********************
 
  
* Table 2: Bayesian multilevel regressions
* Figure 3: Posterior distributions of the effects of newspapers mergers on newspaper content
use "outlet month quality data.dta", clear
set seed 1234
bayes, melabel mcmcsize(10000) burnin(2500) rseed(1234) prior({quality:post_merged}, normal(0, 1)): ///
 mixed quality post_merged i.month i.year pandemic election_3m subsidy_amount || outlet_id:
 bayestest interval {quality:post_merged}, lower(0)
 * A: News content quality
 bayesgraph hist {quality:post_merged}, scheme(s2mono) graphregion(color(white)) plotregion(color(white)) ///
 scale(1.5) title(" ") frac ylabel(, angle(0) gmin gmax) xlabel(-0.1(0.05)0.1) xline(0, lpattern(dash)) ///
 ytitle("Frequency") xtitle("Parameter estimates") col(gs8)

bayes, melabel mcmcsize(10000) burnin(2500) rseed(1234) prior({geo_loc:post_merged}, normal(0, 1)): ///
 mixed geo_loc post_merged i.month i.year pandemic election_3m subsidy_amount || outlet_id:
 bayestest interval {geo_loc:post_merged}, upper(0)
 * B: Local news
 bayesgraph hist {geo_loc:post_merged}, scheme(s2mono) graphregion(color(white)) plotregion(color(white)) ///
 scale(1.5) title(" ") frac ylabel(, angle(0) gmin gmax) xlabel(-0.1(0.05)0.1) xline(0, lpattern(dash)) ///
 ytitle("Frequency") xtitle("Parameter estimates") col(gs8)
 
bayes, melabel mcmcsize(10000) burnin(2500) rseed(1234) prior({agency:post_merged}, normal(0, 1)): ///
 mixed agency post_merged i.month i.year pandemic election_3m subsidy_amount || outlet_id:
 bayestest interval {agency:post_merged}, lower(0)
 * C: News agency content
 bayesgraph hist {agency:post_merged}, scheme(s2mono) graphregion(color(white)) plotregion(color(white)) ///
 scale(1.5) title(" ") frac ylabel(, angle(0) gmin gmax) xlabel(-0.1(0.05)0.1) xline(0, lpattern(dash)) ///
 ytitle("Frequency") xtitle("Parameter estimates") col(gs8)
 
bayes, melabel mcmcsize(10000) burnin(2500) rseed(1234) prior({dup_headline_text:post_merged}, normal(0, 1)): ///
 mixed dup_headline_text post_merged i.month i.year pandemic election_3m subsidy_amount || outlet_id:
 bayestest interval {dup_headline_text:post_merged}, lower(0)
 * D: Content duplication 
 bayesgraph hist {dup_headline_text:post_merged}, scheme(s2mono) graphregion(color(white)) plotregion(color(white)) ///
 scale(1.5) title(" ") frac ylabel(, angle(0) gmin gmax) xlabel(-0.1(0.05)0.1) xline(0, lpattern(dash)) ///
 ytitle("Frequency") xtitle("Parameter estimates") col(gs8)


 
 
 


 

* Table A15: Bayesian multilevel regressions (three level model)
use "outlet month quality data.dta", clear
set seed 1234
bayes, melabel mcmcsize(10000) burnin(2500) rseed(1234) prior({quality:post_merged}, normal(0, 1)): ///
 mixed quality post_merged i.month i.year pandemic election_3m subsidy_amount || outlet_id: || owner_id:
 bayestest interval {quality:post_merged}, lower(0)

bayes, melabel mcmcsize(10000) burnin(2500) rseed(1234) prior({geo_loc:post_merged}, normal(0, 1)): ///
 mixed geo_loc post_merged i.month i.year pandemic election_3m subsidy_amount || outlet_id: || owner_id:
 bayestest interval {geo_loc:post_merged}, upper(0)
 
bayes, melabel mcmcsize(10000) burnin(2500) rseed(1234) prior({agency:post_merged}, normal(0, 1)): ///
 mixed agency post_merged i.month i.year pandemic election_3m subsidy_amount || outlet_id: || owner_id:
 bayestest interval {agency:post_merged}, lower(0)
 
bayes, melabel mcmcsize(10000) burnin(2500) rseed(1234) prior({dup_headline_text:post_merged}, normal(0, 1)): ///
 mixed dup_headline_text post_merged i.month i.year pandemic election_3m subsidy_amount || outlet_id: || owner_id:
 bayestest interval {dup_headline_text:post_merged}, lower(0) 

 

 
 
 
* Table A16: Bayesian multilevel regressions (excluding observations during the coronavirus pandemic)
use "outlet month quality data.dta", clear
set seed 1234
bayes, melabel mcmcsize(10000) burnin(2500) rseed(1234) prior({quality:post_merged}, normal(0, 1)): ///
 mixed quality post_merged i.month i.year election_3m subsidy_amount || outlet_id: if pandemic == 0
 bayestest interval {quality:post_merged}, lower(0)

bayes, melabel mcmcsize(10000) burnin(2500) rseed(1234) prior({geo_loc:post_merged}, normal(0, 1)): ///
 mixed geo_loc post_merged i.month i.year election_3m subsidy_amount || outlet_id: if pandemic == 0
 bayestest interval {geo_loc:post_merged}, upper(0)
 
bayes, melabel mcmcsize(10000) burnin(2500) rseed(1234) prior({agency:post_merged}, normal(0, 1)): ///
 mixed agency post_merged i.month i.year election_3m subsidy_amount || outlet_id: if pandemic == 0
 bayestest interval {agency:post_merged}, lower(0)
 
bayes, melabel mcmcsize(10000) burnin(2500) rseed(1234) prior({dup_headline_text:post_merged}, normal(0, 1)): ///
 mixed dup_headline_text post_merged i.month i.year election_3m subsidy_amount || outlet_id: if pandemic == 0
 bayestest interval {dup_headline_text:post_merged}, lower(0)
 
 

 
 
 

* Table A17: Regression results from fixed effects models
use "outlet month quality data.dta", clear
set seed 1234
bayes, melabel mcmcsize(10000) burnin(2500) rseed(1234) prior({quality:post_merged}, normal(0, 1)): ///
 mixed quality post_merged i.month i.year pandemic election_3m subsidy_amount i.outlet_id 

bayes, melabel mcmcsize(10000) burnin(2500) rseed(1234) prior({geo_loc:post_merged}, normal(0, 1)): ///
 mixed geo_loc post_merged i.month i.year pandemic election_3m subsidy_amount i.outlet_id 
 
bayes, melabel mcmcsize(10000) burnin(2500) rseed(1234) prior({agency:post_merged}, normal(0, 1)): ///
 mixed agency post_merged i.month i.year pandemic election_3m subsidy_amount i.outlet_id 
 
bayes, melabel mcmcsize(10000) burnin(2500) rseed(1234) prior({dup_headline_text:post_merged}, normal(0, 1)): ///
 mixed dup_headline_text post_merged i.month i.year pandemic election_3m subsidy_amount i.outlet_id 
 
 
 
 
* Figure A12: Multilevel regression results when excluding each owner at a time
use "outlet month quality data.dta", clear
gen owner1 = owner

replace owner1 = "EskilstunaKS" if owner1 == "Eskilstuna-Kurirens stiftelse"
replace owner1 = "Gota" if owner1 == "Gota Media AB"
replace owner1 = "Hall" if owner1 == "Hall Media"
replace owner1 = "HallandsbygdensT" if owner1 == "Hallandsbygdens Tidningsförening"
replace owner1 = "HörlingsL" if owner1 == "Hörlings Lidköpingspress AB"
replace owner1 = "JTAB" if owner1 == "Jämtlands Tidning AB"
replace owner1 = "Kurirengruppen" if owner1 == "Kurirengruppen i Sverige AB"
replace owner1 = "Lysekilsposten" if owner1 == "Lysekilsposten AB"
replace owner1 = "Mentor" if owner1 == "Mentor Media"
replace owner1 = "NTM" if owner1 == "NTM-koncernen"
replace owner1 = "NWT" if owner1 == "Nya Wermlands-Tidningen"
replace owner1 = "OrtstidningarIV" if owner1 == "Ortstidningar i Väst"
replace owner1 = "PNV" if owner1 == "PNV Media"
replace owner1 = "Pukslagaren" if owner1 == "Pukslagaren i Helsingborg"
replace owner1 = "SkaneT" if owner1 == "Skåne Tidningsägareföreningen"
replace owner1 = "Swepress" if owner1 == "Swepress Media"
replace owner1 = "TidningarIN" if owner1 == "Tidningar i Norr AB"
replace owner1 = "TidningsföreningenS" if owner1 == "Tidningsföreningen Skaraborgsbygden upa"
replace owner1 = "VKM" if owner1 == "VK Media"
replace owner1 = "VärmlandsFD" if owner1 == "Värmlands Folkblad Drift AB"
replace owner1 = "WMMedia" if owner1 == "WM Media"

levelsof owner1, local(owners)

local clean_owners

foreach owner1 in `owners' {    
    bayes, melabel mcmcsize(10000) burnin(2500) rseed(1234) prior({quality:post_merged}, normal(0, 1)): ///
	mixed quality post_merged i.month i.year pandemic election_3m subsidy_amount if owner1 != "`owner1'" || outlet_id:
} 

gen coeff = .
gen lower = .
gen upper = .
collapse (mean) coeff lower upper, by(owner1)
    	
replace coeff = .053622 if owner1 == "Bonnier"
replace coeff = .0487822 if owner1 == "EskilstunaKS"
replace coeff = .0572811 if owner1 == "Gota"
replace coeff = .0803165 if owner1 == "Hall"
replace coeff = .0538946 if owner1 == "HallandsbygdensT"
replace coeff = .0539881 if owner1 == "HörlingsL"
replace coeff = .0529763 if owner1 == "JTAB"
replace coeff = .0470183 if owner1 == "Kurirengruppen"
replace coeff = .0496941 if owner1 == "Lysekilsposten"
replace coeff = .0506956 if owner1 == "Mentor"
replace coeff = .0629884 if owner1 == "Mittmedia"
replace coeff = .0178063 if owner1 == "NTM"
replace coeff = .064672 if owner1 == "NWT"
replace coeff = .0506252 if owner1 == "OrtstidningarIV"
replace coeff = .046547 if owner1 == "PNV"
replace coeff = .0508925 if owner1 == "Promedia"
replace coeff = .0524516 if owner1 == "Pukslagaren"
replace coeff = .0507463 if owner1 == "Schibsted"
replace coeff = .050827 if owner1 == "SkaneT"
replace coeff = .0539989 if owner1 == "Socialdemokraterna"
replace coeff = .0542202 if owner1 == "Stampen"
replace coeff = .0510953 if owner1 == "Swepress"
replace coeff = .0545359 if owner1 == "TidningarIN"
replace coeff = .0506283 if owner1 == "TidningsföreningenS"
replace coeff = .0451688 if owner1 == "VKM"
replace coeff = .0521124 if owner1 == "VärmlandsFD"
replace coeff = .0466531 if owner1 == "WMMedia"

replace lower = .0317084 if owner1 == "Bonnier"
replace lower = .0276581 if owner1 == "EskilstunaKS"
replace lower = .0344409 if owner1 == "Gota"
replace lower = .0585807 if owner1 == "Hall"
replace lower = .0324432 if owner1 == "HallandsbygdensT"
replace lower = .0333332 if owner1 == "HörlingsL"
replace lower = .0322019 if owner1 == "JTAB"
replace lower = .0264135 if owner1 == "Kurirengruppen"
replace lower = .0290373 if owner1 == "Lysekilsposten"
replace lower = .0291914 if owner1 == "Mentor"
replace lower = .0403378 if owner1 == "Mittmedia"
replace lower = -.0044358 if owner1 == "NTM"
replace lower = .042192 if owner1 == "NWT"
replace lower = .0299397 if owner1 == "OrtstidningarIV"
replace lower = .0255505 if owner1 == "PNV"
replace lower = .0303476 if owner1 == "Promedia"
replace lower = .0318264 if owner1 == "Pukslagaren"
replace lower = .0298986 if owner1 == "Schibsted"
replace lower = .0296954 if owner1 == "SkaneT"
replace lower = .0337598 if owner1 == "Socialdemokraterna"
replace lower = .0335999 if owner1 == "Stampen"
replace lower = .0307907 if owner1 == "Swepress"
replace lower = .0339697 if owner1 == "TidningarIN"
replace lower = .0302034 if owner1 == "TidningsföreningenS"
replace lower = .0239467 if owner1 == "VKM"
replace lower = .0324013 if owner1 == "VärmlandsFD"
replace lower = .0263576 if owner1 == "WMMedia"
 
replace upper = .0763114 if owner1 == "Bonnier"
replace upper = .0705976 if owner1 == "EskilstunaKS"
replace upper = .0796849 if owner1 == "Gota"
replace upper = .1025272 if owner1 == "Hall"
replace upper = .07599 if owner1 == "HallandsbygdensT"
replace upper = .0748253 if owner1 == "HörlingsL"
replace upper = .0739774 if owner1 == "JTAB"
replace upper = .0674727 if owner1 == "Kurirengruppen"
replace upper = .0711256 if owner1 == "Lysekilsposten"
replace upper = .0722733 if owner1 == "Mentor"
replace upper = .0869908 if owner1 == "Mittmedia"
replace upper = .0408122 if owner1 == "NTM"
replace upper = .0868389 if owner1 == "NWT"
replace upper = .0722196 if owner1 == "OrtstidningarIV"
replace upper = .0685855 if owner1 == "PNV"
replace upper = .0716621 if owner1 == "Promedia"
replace upper = .0738535 if owner1 == "Pukslagaren"
replace upper = .0726593 if owner1 == "Schibsted"
replace upper = .0720813 if owner1 == "SkaneT"
replace upper = .0754968 if owner1 == "Socialdemokraterna"
replace upper = .0764184 if owner1 == "Stampen"
replace upper = .0720431 if owner1 == "Swepress"
replace upper = .0760825 if owner1 == "TidningarIN"
replace upper = .0724647 if owner1 == "TidningsföreningenS"
replace upper = .0662656 if owner1 == "VKM"
replace upper = .0728845 if owner1 == "VärmlandsFD"
replace upper = .067515 if owner1 == "WMMedia"
 
encode owner1, gen(o_id)
 
twoway (scatter o_id coeff) (rspike lower upper o_id, hor), ///
       ylabel(#27, valuelabel angle(0) nogrid) graphregion(color(white)) scheme(s2mono) ///
       legend(off) ytitle(" ") xtitle(" " "Posterior mean of coefficient") scale(0.9) ///
	   xlabel(-0.12(0.06)0.12) xline(0, lpattern(dash) lcolor(gs4))
 


 


 
 
 
 
 
 
 
 
 
 
 
 